package com.iot.ammeter.controller.user;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.iot.ammeter.dto.web.login.LoginAndRegisterDTO;
import com.iot.ammeter.anno.LogAnnotation;
import com.iot.ammeter.dto.web.user.PasswordDTO;
import com.iot.ammeter.dto.web.user.WebUserDetailDTO;
import com.iot.ammeter.dto.web.user.WebUserRoleDTO;
import com.iot.ammeter.query.web.user.WebUserQuery;
import com.iot.ammeter.responseResult.ResponseResult;
import com.iot.ammeter.service.web.user.WebUserService;
import com.iot.ammeter.utils.CheckTool;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.Map;
import java.util.Objects;

/**
 * <p>
 * web端用户表 前端控制器
 * </p>
 *
 * @author basil
 * @since 2021-09-25
 */
@Api(tags = {"web端用户管理"})
@RestController
@RequestMapping("/api/web_user")
public class WebUserController {
    private final WebUserService webUserService;

    public WebUserController(WebUserService webUserService) {
        this.webUserService = webUserService;
    }

    /**
     * web端用户注册
     *
     * @param registerDTO 注册email及密码
     * @return 注册成功或者失败json数据
     */
    @ApiOperation("web端用户注册")
    @LogAnnotation(module = "webUserRegister", operator = "web端用户注册")
    @PostMapping("/register")
    public ResponseResult webUserRegister(@RequestBody LoginAndRegisterDTO registerDTO) {
        String tips = webUserService.webUserRegister(registerDTO);
        return "注册成功".equals(tips) ? ResponseResult.SUCCESS(tips) : ResponseResult.FAILED(tips);
    }

    /**
     * web端用户登录
     *
     * @param loginDTO 登录email及密码
     * @return 返回令牌
     */
    @ApiOperation("web端用户登录")
    @LogAnnotation(module = "webUserLogin", operator = "web端用户登录")
    @PostMapping("/login")
    public ResponseResult webUserLogin(@RequestBody LoginAndRegisterDTO loginDTO) {
        String email = loginDTO.getEmail().trim();
        String password = loginDTO.getPassword().trim();
        if (StringUtils.isEmpty(password)) {
            return ResponseResult.FAILED("密码不能为空");
        }
        if (StringUtils.isEmpty(email)) {
            return ResponseResult.FAILED("邮箱不能为空");
        }
        if (!CheckTool.isEmail(email)) {
            return ResponseResult.FAILED("邮箱格式有误");
        }
        Map<String, Object> map = webUserService.webUserLogin(loginDTO);
        return map != null ? ResponseResult.SUCCESS(map) : ResponseResult.FAILED("账户密码错误");
    }

    /**
     * 修改web端用户密码
     *
     * @param passwordDto 邮箱及新旧密码
     * @return 修改密码成功或者失败提示
     */
    @ApiOperation("修改web端用户密码")
    @LogAnnotation(module = "changeWebUserPassword", operator = "修改web端用户密码")
    @PutMapping("/change_password")
    public ResponseResult changeWebUserPassword(@RequestBody PasswordDTO passwordDto) {
        String tips = webUserService.changeWebUserPassword(passwordDto);
        return "修改密码成功".equals(tips) ? ResponseResult.SUCCESS(tips) : ResponseResult.FAILED(tips);
    }

    /**
     * 重置web端用户密码
     *
     * @param passwordDto 邮箱及新密码
     * @return 重置web端用户密码成功或者失败提示
     */
    @ApiOperation("重置web端用户密码")
    @LogAnnotation(module = "resetWebUserPassword", operator = "重置web端用户密码")
    @PutMapping("/reset_web_user_password")
    public ResponseResult resetWebUserPassword(@RequestBody PasswordDTO passwordDto) {
        String tips = webUserService.resetWebUserPassword(passwordDto);
        return "重置密码成功".equals(tips) ? ResponseResult.SUCCESS(tips) : ResponseResult.FAILED(tips);
    }

    /**
     * 获取web端用户详情
     *
     * @param webUserId web端用户详情
     * @return web端用户详情json数据
     */
    @ApiOperation("获取web端用户详情")
    @LogAnnotation(module = "getWebUserDetailByWebUserId", operator = "获取web端用户详情")
    @GetMapping("/detail/{webUserId}")
    public ResponseResult getWebUserDetailByWebUserId(@PathVariable String webUserId) {
        if (StringUtils.isEmpty(webUserId.trim())) {
            return ResponseResult.FAILED("web端用户id不能为空");
        }
        WebUserDetailDTO webUserDetailDto = webUserService.getWebUserDetailByWebUserId(webUserId);
        return webUserDetailDto != null ? ResponseResult.SUCCESS(webUserDetailDto) : ResponseResult.FAILED("用户不存在");
    }

    /**
     * 判断邮箱是否已被注册
     *
     * @param email 邮箱号
     * @return ResponseResult
     */
    @ApiOperation("判断电子邮箱是否被注册")
    @LogAnnotation(module = "emailIsExists", operator = "判断电子邮箱是否被注册")
    @GetMapping("/email_is_exists/{email}")
    public ResponseResult emailIsExists(@PathVariable String email) {
        String tips = webUserService.emailIsExists(email);
        return "邮箱可用".equals(tips) ? ResponseResult.SUCCESS(tips) : ResponseResult.FAILED(tips);
    }


    /**
     * 获取web端用户列表
     *
     * @param page         请求页码
     * @param pageSize     每页数量
     * @param webUserQuery 查询条件
     * @return web端用户列表json数据
     */
    @ApiOperation("获取web端用户列表")
    @LogAnnotation(module = "getWebUserList", operator = "获取web端用户列表")
    @PostMapping("/list/{page}/{pageSize}")
    public ResponseResult getWebUserList(@PathVariable int page,
                                         @PathVariable int pageSize,
                                         @RequestBody(required = false) WebUserQuery webUserQuery) {
        /**
         * 数据校验
         */
        if (page <= 0 || pageSize <= 0) {
            return ResponseResult.FAILED("页码参数错误");
        }
        IPage<WebUserDetailDTO> iPage = webUserService.getWebUserList(page, pageSize, webUserQuery);
        return iPage.getRecords().size() > 0 ? ResponseResult.SUCCESS(iPage) : ResponseResult.FAILED("无数据");
    }

    /**
     * 添加web端用户
     *
     * @param webUserDTO 用户信息
     * @return ResponseResult
     */
    @ApiOperation("添加用户")
    @LogAnnotation(module = "addWebUser", operator = "添加用户")
    @PostMapping("/adjuration")
    public ResponseResult addWebUser(@RequestBody WebUserDetailDTO webUserDTO) {
        String tips = webUserService.addWebUser(webUserDTO);
        return "添加用户成功".equals(tips) ? ResponseResult.SUCCESS(tips) : ResponseResult.FAILED(tips);
    }

    /**
     * 更新用户信息
     *
     * @param webUserId  用户id
     * @param webUserDTO 要修改的信息
     * @return 操作结果详情
     */
    @ApiOperation("更新用户信息")
    @LogAnnotation(module = "updateWebUser", operator = "更新用户信息")
    @PutMapping("/update/{webUserId}")
    public ResponseResult updateWebUser(@PathVariable String webUserId, @RequestBody WebUserDetailDTO webUserDTO) {
        if (webUserDTO == null || !webUserDTO.getWebUserId().equals(webUserId)) {
            return ResponseResult.FAILED("参数有误");
        }
        boolean result = webUserService.updateWebUser(webUserDTO);
        return result ? ResponseResult.SUCCESS() : ResponseResult.FAILED();
    }

    /**
     * 修改用户角色
     *
     * @param webUserRole 用户id
     */
    //@PreAuthorize("@permission.isAdmin()")
    @ApiOperation("修改用户角色信息")
    @LogAnnotation(module = "updateWebUserRole", operator = "修改用户角色信息")
    @PutMapping("/update/roles")
    public ResponseResult updateWebUserRole(@RequestBody WebUserRoleDTO webUserRole) {
        if (StringUtils.isBlank(webUserRole.getWebUserId()) || StringUtils.isBlank(webUserRole.getRoleId())) {
            return ResponseResult.FAILED("用户id与角色id不能为空");
        }
        return webUserService.updateWebUserRole(webUserRole) ? ResponseResult.SUCCESS("修改用户角色成功") : ResponseResult.FAILED("修改用户角色失败");
    }
}
